#include	"NIXIE.h"

static void GPIO_config(void) {
	// P30  P31  准双向口
	GPIO_InitTypeDef	GPIO_InitStructure;		//结构定义
	GPIO_InitStructure.Pin  = GPIO_Pin_4 | GPIO_Pin_3 | GPIO_Pin_2;		//指定要初始化的IO,
	GPIO_InitStructure.Mode = GPIO_OUT_PP;	//指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
	GPIO_Inilize(GPIO_P4, &GPIO_InitStructure);//初始化
}


void NIXIE_Iinit(void)
{
    EAXSFR();
    GPIO_config();  // 调用GPIO配置函数
}

//原始数据驱动数码管
void Nixie_show(u8 num,u8 index)
{
    char i;//i--必须要用字符型变量，u8太容易出错了，
    //数字内容，
    //数码管的74芯片采用级联方式，读取数据时从高位逐个移位读入，数字在前八位，位置在后八位
    //数码管采用共阳极时，数字为0点亮，数字为1熄灭，位置为1点亮，位置为0熄灭
    //先从高位开始读取，所以要从7开始
    for(i=7;i>=0;i--){
        //从高位逐个读入，7，6，5，4，3，2，1，0
        NIX_DI = num >> i & 0x01;

        // 移位 电平由0 -> 1变化一次，数据移位一次，或者说读入一位数据
        NIX_SCK = 0;
        // 空操作，让程序停一下，防止电平变化太快，数据移位错误
        NOP2();
        // 移位 电平由1 -> 0变化一次，数据移位一次，或者说读入一位数据
        NIX_SCK = 1;
        // 空操作，让程序停一下，防止电平变化太快，数据移位错误
        NOP2();
    }

    //数码管位置
    //数码管的74芯片采用级联方式，读取数据时从高位逐个移位读入，数字在前八位，位置在后八位
    //数码管采用共阳极时，数字为0点亮，数字为1熄灭，位置为1点亮，位置为0熄灭
    //先从高位开始读取，所以要从7开始
    for (i=7;i >=0;i--){
        NIX_DI = index >> i & 0x01;
        // 移位 0 -> 1
        NIX_SCK = 0;
        NOP2();
        NIX_SCK = 1;
        NOP2();
    }
    //RCK电平由0 -> 1变化一次，数据锁存一次，
    //数据锁存后，数码管显示的内容和位置都不变，
    //由于我们使用了8个数码管，数字内容占高八位，数码管索引位置占第八位，所以数据移位16次锁存一次
    // 锁存 0 -> 1
    NIX_RCK = 0;
    NOP2();
    NIX_RCK = 1;
    NOP2();
}

// 索引对应表格参见：
// https://www.yuque.com/icheima/stc8h/kmz2mllvxs1uvdfy#lLhhp
u8 code LED_TABLE[] = 
{
	// 0 	1	 2	-> 9	(索引012...9)
	0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,
	// 0. 1. 2. -> 9.	(索引10,11,12....19)
    0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,
	// . -						(索引20,21)
	0x7F, 0xBF,
	// AbCdEFHJLPqU		(索引22,23,24....33)
	0x88,0x83,0xC6,0xA1,0x86,0x8E,0x89,0xF1,0xC7,0x8C,0x98,0xC1
};
//引用码表驱动数码管
void Nixie_Dishplay(u8 num,u8 index)
{
    char i;
    num = LED_TABLE[num];
    //数字内容
    //数码管的74芯片采用级联方式，读取数据时从高位逐个读入
    //先从高位开始读取，所以要从7开始
    for(i=7;i>=0;i--){
        // 移位 0 -> 1
        NIX_DI = num >> i & 0x01;
        //移位，SCK由0至1上升沿变化一次，数据移位一次，或者说读入一位数据
        NIX_SCK = 0;
        // 空操作，让程序停一下，防止时序出错
        NOP2();
        // 移位，SCK由1至0下降沿变化一次，数据移位一次，或者说读入一位数据
        NIX_SCK = 1;
        // 空操作，让程序停一下，防止时序出错
        NOP2();

    }
    //数码管位置
    //数码管的74芯片采用级联方式，读取数据时从高位逐个读入
    //先从高位开始读取，所以要从7开始
    for(i = 7;i>=0;i--){
        NIX_DI = index >> i & 0x01;
        NIX_SCK = 0;
        NOP2();
        NIX_SCK = 1;
        NOP2();
    }
    NIX_RCK = 0;
    NOP2();
    NIX_RCK = 1;
    NOP2();
}